/*
连接：https://www.nowcoder.com/practice/a5190a7c3ec045ce9273beebdfe029ee?tpId=85&&tqId=29839&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking
题目：幸运的袋子
简介：一个袋子里面有n个球，每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如：如果袋子里面的球的号码是{1, 1, 2, 3}，这个袋子就是幸运的，因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完)，要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。

解析：
    要想一组数字的和是大于乘积，那么这组数字之中必然要有1.
    所以我们可以采用回溯的方式，先对数据进行排序。
    然后确定一个起始位置，逐步向后追加数字，由于数据有序，当我们找到一个数据导致当前数组不满足条件后，那么后续的数字加入进来依然不满足
    所以，可以进行回退。
    回退有两种方式，当前数据为1，那么后面的数据组合依然有可能存在
    当前数据不为1，直接跳出，意味着以前面数据为基础的数组已经结束，不会再有合法的数组了
*/

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int getnums(vector<int>& v,int n,int pos,int sum,int mul)
{
    int count=0;
    for(int i=pos;i<n;i++)
    {
        sum+=v[i];
        mul*=v[i];
        if(sum>mul)
        {
            count += 1+getnums(v,n,i+1,sum,mul);
        }
        else if(v[i]==1)
        {
            count += getnums(v,n,i+1,sum,mul);
        }
        else {
            break;
        }
        //回溯
        sum-=v[i];
        mul/=v[i];
        while(i<n-1 && v[i]==v[i+1])
        {  i++;}
    }
    return count;
}
int main() {
    int n;
    vector<int> v;
    while(cin>>n)
    {
        v.resize(n);
        for(int i=0;i<n;i++)
        {
            cin>>v[i];
        }
    }
    sort(v.begin(),v.end());
    cout<<getnums(v,n,0,0,1)<<endl;
}